/**
 * @file   UrlFrontier.hpp
 * @author Liu Yuan <liuyuan@net.pku.edu.cn>
 * @date   Mon Jun 25 10:50:14 2007
 *
 * @brief Url调度模块
 *
 * 对于每一轮抓取，输出一个抓取队列向量，每个队列对应一个抓取线程
 */

#ifndef __URLFRONTIER_HPP
#define __URLFRONTIER_HPP

#include "Url.hpp"
#include "Host.hpp"

#include <string>
#include <vector>
#include <queue>
#include <fstream>

const int DEFAULT_URL_CRAWLED = 10000;  /**< 每一轮抓取需要抓取的数量 */

class UrlFrontier
{
public:
    /**
     * @param crFilePath 存储待抓取Url的列表的文件夹
     * @param threadnum 对应的抓取线程的数量，即向量的数量
     */
    UrlFrontier(const std::string& crFilePath, const int threadnum);

    /**
     * 添加Url到Url待抓取列表
     *
     * @param crUrlKey 添加到列表的Url串
     * @return
     */
    bool AddUrl(const std::string& crUrlKey);

    /**
     * @param[out] rTaskQueen 返回的等待抓取的队列向量
     * @param rHost Host类，作为DNS缓存
     *
     * @return 总得待抓取的Url数量
     */
    int GetTaskQueue(std::vector<std::queue<Url> >& rTaskQueen, Host& rHost);

private:
    bool ResumeOffset();
    void SaveOffset();

private:
    std::string   mUrlFilePath;
    std::string   mOffsetFilePath;
    int           iThreadNum;
    unsigned int  curFileOffset;
    std::ofstream urlFile;
};

#endif
